home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / mgr / sparcmgr / demo1.zoo / demo / icon / snap.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-01-24  |  7.8 KB  |  297 lines

  1. /*                        Copyright (c) 1988 Bellcore
  2.  *                            All Rights Reserved
  3.  *       Permission is granted to copy or use this program, EXCEPT that it
  4.  *       may not be sold for profit, the copyright notice must be reproduced
  5.  *       on copies, and credit should be given to Bellcore where it is due.
  6.  *       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
  7.  */
  8. /*    $Header: snap.c,v 4.5 88/08/23 10:47:42 bianchi Exp $
  9.     $Source: /tmp/mgrsrc/demo/icon/RCS/snap.c,v $
  10. */
  11. static char    RCSid_[] = "$Source: /tmp/mgrsrc/demo/icon/RCS/snap.c,v $$Revision: 4.5 $";
  12.  
  13. /* snap a piece of the screen -- only works locally */
  14.  
  15. #include <signal.h>
  16. #include <sys/file.h>
  17. #include "term.h"
  18. #include "bitmap.h"
  19. #include "dump.h"
  20.  
  21. #define ICON   "easel"
  22. #define SCREEN   "/dev/bwtwo0"
  23. #define min(x,y)      ((x)>(y)?(y):(x))
  24. #define dprintf   if(debug)fprintf
  25. #define PRINTER   "lp"         /* default printer name */
  26. #define CANCEL      10            /* time after which REVIEW is canceled */
  27.  
  28. static char buff[100];         /* mgr input buffer */
  29. static char cmd[100];            /* lpr command buffer */
  30. static char *name;               /* file name */
  31. static char my_host[32];            /* my-host */
  32. static char mgr_host[32];            /* mgr host */
  33.  
  34. static int debug=0;
  35. static int review=0;            /* review more set */
  36. static int func = BIT_SRC;
  37.  
  38. #define MENU_COUNT      (sizeof(menu)/sizeof(struct menu_entry))
  39.  
  40. static struct menu_entry menu[] = {
  41.    "print","Print\r",
  42.    "file","File\r",
  43.    "review =>","View\r",
  44.    "quit","Quit\r",
  45. };
  46. static struct menu_entry rop[] = {
  47.    "set","-Set\r",
  48.    "paint","-Paint\r",
  49.    "xor","-Xor\r",
  50.    "mask","-Mask\r",
  51. };
  52.  
  53. main(argc,argv)
  54. int argc;
  55. char **argv;
  56.    {
  57.    BITMAP *screen , *tmp = (BITMAP *) 0;
  58.    char *printer, *getenv();
  59.  
  60.    FILE *fp;      /* file to write */
  61.    int w,h;
  62.    int wide,high;   /* picture size */
  63.    int x,y;      /* window pos */
  64.    int x1,y1;   /* sweep coords */
  65.    int xmax, ymax;      /* display size */
  66.    int n;
  67.    int snapping = 0;      /* ready to snap */
  68.    int format = OLD_BHDR;            /* new format */
  69.    int cancel(),clean();
  70.  
  71.    FILE *pf;
  72.    
  73.    ckmgrterm();
  74.  
  75.    debug = (int) getenv("DEBUG");
  76.  
  77.    if (argc > 1 && strcmp("-n",argv[1])==0) {
  78.       format=NEW_BHDR;
  79.       argc--;
  80.       argv++;
  81.         }
  82.  
  83.    if (argc != 2) {
  84.       fprintf(stderr,"Usage: snap [-n] <file>\n");
  85.       exit(1);
  86.       }
  87.  
  88.    name = argv[1];
  89.  
  90.    if ((screen = bit_open(SCREEN)) == (BITMAP *) 0) {
  91.       fprintf(stderr,"%s: Can't find %s\n",*argv,SCREEN);
  92.       exit(1);
  93.       }
  94.  
  95.    if ((fp = fopen(name, "w")) == NULL) {
  96.       perror("fopen");
  97.       fprintf(stderr,"%s: Can't fopen %s\n",*argv,name);
  98.       exit(1);
  99.       }
  100.  
  101.    if ((printer = getenv("PRINTER")) == (char *) 0)
  102.       printer = PRINTER;
  103.    sprintf(cmd,"lpr -P%s -J%s -v",printer,name);
  104.  
  105.    /* setup mgr library */
  106.  
  107.    m_setup(0);
  108.  
  109.    get_param(mgr_host,&xmax,&ymax,0);
  110.    gethostname(my_host,sizeof(my_host));
  111.  
  112.    if (strcmp(my_host,mgr_host) != 0) {
  113.       fprintf(stderr,"%s only works on host: %s\n",
  114.                argv[0],mgr_host);
  115.       exit(1);
  116.        }
  117.  
  118.    m_push(P_FONT|P_FLAGS|P_MENU|P_POSITION);
  119.    m_ttyset();
  120.    signal(SIGALRM,cancel);
  121.    signal(SIGTERM,clean);
  122.    signal(SIGINT,clean);
  123.    signal(SIGHUP,clean);
  124.  
  125.    m_setmode(M_NOWRAP);
  126.    m_setmode(M_ABS);
  127.    m_func(B_COPY);
  128.    m_bitfromfile(1,ICON);
  129.    m_flush();
  130.    m_gets(buff);
  131.    n = sscanf(buff,"%d %d",&w,&h);
  132.    if (n < 2) {
  133.       fprintf(stderr,"%s: Can't find %s\n",*argv,ICON);
  134.       clean(1);
  135.       }
  136.    setup(1,w,h);
  137.    m_setevent(BUTTON_1,"S%R\r");   /* get coords */
  138.    m_setevent(REDRAW,"Redraw\r");    /* get coords */
  139.    m_setevent(RESHAPE,"Reshape\r");    /* get coords */
  140.    menu_load(1,MENU_COUNT,menu);
  141.    menu_load(2,MENU_COUNT,rop);
  142.    m_selectmenu(1);
  143.    m_linkmenu(1,2,2,6);
  144.    m_clearmode(M_ACTIVATE);
  145.  
  146.    m_flush();
  147.    while(m_gets(buff)) {
  148.       dprintf(stderr,"got %s\n",buff);
  149.       switch (*buff) {
  150.       case 'R':            /* redraw */
  151.          setup(1,w,h);
  152.          m_clearmode(M_ACTIVATE);
  153.          break;
  154.       case 'S':            /* set up to snap a picture */
  155.          n = sscanf(buff+1,"%d %d %d %d",&x,&y,&x1,&y1);
  156.          if (n < 4)
  157.             break;;
  158.          m_setmode(M_WOB);
  159.          wide = abs(x1-x);
  160.          high = abs(y1-y);
  161.          x = min(x,x1);
  162.          y = min(y,y1);
  163.          m_push(P_MOUSE);
  164.          if (x > 16 || y > 16)
  165.             m_movemouse(0,0);         /* get mouse out of the picture */
  166.          else 
  167.             m_movemouse(xmax-17,ymax-17);
  168.          if (review) {
  169.             alarm(0);
  170.             m_sendme("B review\r");                     /* synchronize review */
  171.             }
  172.          else {
  173.             m_sendme("E snap\r");                     /* synchronize snap */
  174.             snapping = 1;
  175.             if (tmp) {
  176.                bit_destroy(tmp);
  177.                tmp = NULL;
  178.                }
  179.             tmp = bit_alloc(wide,high,BIT_NULL,1);
  180.             }
  181.          break;
  182.       case 'B':               /* review the picture */
  183.          if (review && tmp && !snapping) {
  184.             review = 0;
  185.             if (wide < 20 && high < 20) {
  186.                wide = BIT_WIDE(tmp);
  187.                high = BIT_HIGH(tmp);
  188.                }
  189.             bit_blit(screen,x,y,wide,high,func,tmp,0,0);
  190.             dprintf(stderr,"review %d,%d by %d,%d\n",x,y,wide,high);
  191.             m_pop();
  192.             }
  193.          m_clearmode(M_WOB);
  194.          m_clearmode(M_ACTIVATE);
  195.          break;
  196.       case 'E':               /* get the picture */
  197.          if (snapping && x!=16 && y!=16) {
  198.             bit_blit(tmp,0,0,wide,high,BIT_SRC,screen,x,y);
  199.             m_pop();
  200.             m_clearmode(M_WOB);
  201.             m_clearmode(M_ACTIVATE);
  202.             }
  203.          snapping = 0;
  204.          break;
  205.       case 'F':                  /* file it */
  206.          if (tmp && !snapping) {
  207.             fseek(fp,0L,0);
  208.             ftruncate(fileno(fp),0);
  209.         if (!bitmapwrite(fp,tmp,format) ) {
  210.                m_push(P_ALL);
  211.                m_font(0);
  212.                m_size(27,3);
  213.                m_clear();
  214.                m_printstr("unable to write file\n");
  215.                m_printstr(name);
  216.                m_flush();
  217.                sleep(3);
  218.                m_pop();
  219.                m_clearmode(M_ACTIVATE);
  220.                m_flush();
  221.                }
  222.             dprintf(stderr,"filing\n");
  223.             }
  224.      fflush(fp);
  225.          m_clearmode(M_ACTIVATE);
  226.          break;
  227.       case 'Q':                  /* quit */
  228.          clean(0);
  229.          break;
  230.       case 'P':                  /* print */
  231.          if (tmp && !snapping && (pf = popen(cmd,"w"))) {
  232.                 bitmapwrite(pf,tmp,format);
  233.             dprintf(stderr,"printing [%s]\n",cmd);
  234.             pclose(pf);
  235.             }
  236.          m_clearmode(M_ACTIVATE);
  237.          break;
  238.       case '-':                  /* set review mode*/
  239.          if (review) 
  240.             switch (*(buff+1)) {
  241.                case 'S':         /* set */
  242.                   func = BIT_SRC;
  243.                   break;
  244.                case 'P':         /* paint */
  245.                   func = BIT_SRC | BIT_DST;
  246.                   break;
  247.                case 'X':         /* XOR */
  248.                   func = BIT_SRC ^ BIT_DST;
  249.                   break;
  250.                case 'M':         /* MASK */
  251.                   func = BIT_SRC & BIT_DST;
  252.                   break;
  253.                }
  254.       case 'V':                  /* review */
  255.          if (tmp && !snapping) {
  256.             alarm(CANCEL);
  257.             review++;
  258.             m_setmode(M_WOB);
  259.             }
  260.          break;
  261.          }
  262.       m_flush();
  263.       }
  264.    
  265.    clean(0);
  266.    }
  267.  
  268. int clean(n)
  269. int n;
  270.    {
  271.    m_ttyreset();
  272.    m_popall();
  273.    exit(n);
  274.    }
  275.  
  276. setup(where,w,h)
  277. int where;      /* bitmap # */
  278. int w,h;         /* window size */
  279.    {
  280.    int wx,wy;    /* window position */
  281.  
  282.    get_size(&wx,&wy,0,0);
  283.    m_shapewindow(wx,wy,w+10,h+10);
  284.    m_clear();
  285.    m_bitcopyto(0,0,w,h,0,0,0,where);
  286.    m_movecursor(w+20,h/2);
  287.    }
  288.  
  289. int
  290. cancel()
  291.    {
  292.    review = 0;
  293.    m_putchar('\007');
  294.    m_clearmode(M_WOB);
  295.    m_flush();
  296.    }
  297.